<?php


namespace app\live\controller\v2;


use app\live\service\Rtc;
use think\Controller;
use think\Log;
use think\response\Json;

/**
 * 调用CreateEventSubscribe创建订阅房间消息的回调控制器
 * Class MentalTestController
 * @support v2.5.5
 * @author Mark
 * @package app\api\controller\v26
 */
class RtcEventSubscribeController extends Controller
{
    /**
     * 写入日志前缀
     * @var string
     */
    private static $LOG_PRE = 'RTC房间消息的回调：';

    /**
     * 调用CreateEventSubscribe创建订阅房间消息的回调方法
     * 参考：https://help.aliyun.com/document_detail/274447.html#h2-url-10
     * @return Json|null
     */
    public function rtcEventSubscribeCallBack(): ?Json
    {
        try
        {
            $header = $this->request->header();
            $params = $this->request->param();
            Log::write(self::$LOG_PRE . '请求数据：header=【' . json_encode($header) . '】,params=【' . json_encode($params) . '】', 'log', true);

            //回调鉴权
            $config = config('rtc');

            $signature = md5($config['subscribe_doamin'] . '|' . $header['ali-rtc-timestamp'] . '|' . $config['app_key']);
            if ($header['ali-rtc-signature'] !== $signature)
            {
                Log::write(self::$LOG_PRE . '回调鉴权失败！ header(ali-rtc-signature)=' . $header['ali-rtc-signature'] . ',signature=' . $signature, 'error', true);
                return show(config('code.error'), '鉴权失败！');
            } else
            {
                Log::write(self::$LOG_PRE . '回调鉴权成功！ header(ali-rtc-signature)=' . $header['ali-rtc-signature'] . ',signature=' . $signature, 'log', true);

                foreach ($params['Contents'] as $v)
                {
                    $event = $v['Event'];
                    if ($event === 'ChannelEvent')
                    {//ChannelEvent用户事件
//                    {
//                      "Event":"ChannelEvent",
//                      "ChannelEvent":{
//                        "ChannelId":"11019251",
//                        "EventTag":"Close",
//                        "Timestamp":1639978708
//                        }
//                     }

                        //事件类型，取值：Open：会议开始。Close：会议结束。
                        if ($v['ChannelEvent']['EventTag'] === 'Open')
                        {//会议开始。
                            Log::write(self::$LOG_PRE . '会议开始', 'log', true);
                        } elseif ($v['ChannelEvent']['EventTag'] === 'Close')
                        {//会议结束
                            Log::write(self::$LOG_PRE . '会议结束', 'log', true);
                        }
                    } else if ($event === 'UserEvent')
                    {//UserEvent用户事件
//           {
//            "Event":"UserEvent",
//            "UserEvent":{
//                "UserId":"1",//用户ID
//                "EventTag":"UnpublishVideo",//事件类型，取值：

//Join：入会。
//Leave：离会。
//PublishVideo：开始推视频流。
//PublishAudio：开始推音频流。
//PublishScreen：开始屏幕共享。
//StopPublishVideo：停止推视频流。
//StopPublishAudio：停止推音频流。
//StopPublishScreen：停止屏幕共享。
//Roleupdate：角色切换。

//                "SessionId":"rURB4M4kxUW9EMqs4DkfTg2doU2RBX4b",//用户SessionID。
//                "Timestamp":1639978708,//事件发生的时间戳。
//                "ChannelProfile":"communication",
//                "US":282574490436612,
//                "Reason":1,//入会、离会原因（仅Join事件有），取值：
//
//1：正常入会、离会。
//2：重连入会（当前会中已有该用户实例，该用户再次入会）。
//3：跨频道转推。
//4：超时离会。
//5：用户启用新的会话，当前会话被挤下线。
//6：被踢出。
//7：频道解散。

//                "Role":1,//角色类型，取值：
//
//1：主播。
//2：观众。
//                "TerminalType":6,//终端类型，取值：
//
//1：Windows设备。
//2：Android设备。
//3：Mac设备。
//4：iOS设备。
//5：Linux设备。
//0：其他（只有Native SDK入会可以解析终端类型)。

//                "UserType":2//用户类型，取值：
//
//1：Native SDK。
//2：WebRTC(非小程序，非Native都归为WebRTC)。
//3：小程序。
//            }


                        $Role = $v['UserEvent']['Role'];
                        switch ($v['UserEvent']['EventTag'])
                        {
                            case 'Join':
                            {
                                $liveId = (int)$params['ChannelId'];
                                $userId = (int)$v['UserEvent']['UserId'];
                                Log::write(self::$LOG_PRE . ($userId === 1 ? '主播' : '观众') . ($v['UserEvent']['UserId']) . '入会,Reason=' . $v['UserEvent']['Reason'], 'log', true);
                                if ($userId === 1)
                                {   // 主播进入

                                } else
                                {   // 用户进入
                                    (new Rtc())->rtcUserJoin($liveId, $userId);
                                }
                                break;
                            }
                            case 'Leave':
                            {
                                $liveId = (int)$params['ChannelId'];
                                $userId = (int)$v['UserEvent']['UserId'];
                                Log::write(self::$LOG_PRE . ($userId === 1 ? '主播' : '观众') . ($v['UserEvent']['UserId']) . '离会,Reason=' . $v['UserEvent']['Reason'], 'log', true);
                                if ($userId === 1)
                                {   // 主播离会
                                    (new Rtc())->rtcClose($liveId, 1, $userId);
                                } else
                                {   // 用户离会
                                    (new Rtc())->rtcClose($liveId, 2, $userId);
                                }
                                break;
                            }
                        }
                    }
                }

            }
        }
        catch (\Exception $e)
        {
            Log::write(self::$LOG_PRE . "异常：{$e->getMessage()};File:{$e->getFile()};Line:{$e->getLine()}", 'error', true);
            return show(config('code.error'), '处理失败！');
        }

        return show(config('code.success'), '回调成功！');
    }

}
